import java.util.Arrays;

/**
 * Created by cc
 * Description:
 * User: CZH
 * Date: 2022-09-10
 * Time: 10:55
 */
public class MyArrayList {
        //成员变量
        public int[] elem;//elem=null
        public int usedSize;
        public static  int capacity = 10;

        //构造方法
        public MyArrayList() {
            this.elem = new int[capacity];
            //this.usedSize = 0;
        }

        //判断顺序表是否满
        public boolean isFull() {
            return this.usedSize == capacity;
        }

        // 在 pos 位置新增元素
        public void add(int pos, int data) {
            //判断pos位置合法性
            if (pos < 0 || pos > capacity) {
                System.out.println("pos不合法");
                return;
            }
            //判断数组是否满，是否需要扩容
            if (isFull()) {
                this.elem = Arrays.copyOf(this.elem,2*capacity);
                capacity *= 2;
            }
            //把pos位置空出来
            for (int i = this.usedSize-1; i >= pos; i--){
                this.elem[i+1] = this.elem[i];
            }
            //添加数据data到pos位置
            this.elem[pos] = data;
            //记录顺序表元素变量+1
            this.usedSize++;
        }
//////////////////////////////////////////////////////////////////////////
        // 打印顺序表
        public void display() {
            if (isEmpty()) {
                System.out.println("顺序表为空~");
                return;
            }
            int i = 0;
            for (i = 0; i < this.usedSize; i++){
                System.out.print(this.elem[i] + " ");
            }
            System.out.println("顺序表打印完毕");
        }

        //判断顺序表是否空
        public boolean isEmpty() {
            return this.usedSize <= 0;
        }

        // 判定是否包含某个元素
        public boolean contains(int toFind) {
            if (isEmpty()) {    //判断非空
                System.out.println("顺序表为空");
                return false;
            }
            //找元素
            for (int i = 0; i < this.usedSize; i++){
                if (this.elem[i] == toFind) {
                    return true;
                }
            }
            return false;
        }

        // 查找某个元素对应的位置
        public int search(int toFind) {
            if (isEmpty()) {    //判断非空
                System.out.println("顺序表为空");
                return -1;
            }

            //找元素
            for (int i = 0; i < this.usedSize; i++){
                if (this.elem[i] == toFind) {
                    return i;
                }
            }
            return -1;
        }

        // 获取 pos 位置的元素
        public int getPos(int pos) {
            if (isEmpty()) {    //判断非空
                throw new RuntimeException("顺序表为空");
            }
            if (pos < 0 || pos >= this.usedSize) {
                throw new RuntimeException("pos不合法");
            }
            //找元素
            return this.elem[pos];
        }

        // 获取顺序表长度
        public int size() {
            if (isEmpty()) {    //判断非空
                System.out.println("顺序表为空");
                return -1;
            }
            return this.usedSize;
        }
//////////////////////////////////////////////////////////////////////////
        // 给 pos 位置的元素设为 value
        public void setPos(int pos, int value) {
            if (isEmpty()) {    //判断非空
                System.out.println("顺序表为空");
                return;
            }
            if (pos < 0 || pos > this.usedSize) {
                System.out.println("pos不合法");
                return;
            }
            this.elem[pos] = value;
        }

        //删除第一次出现的关键字key
        public void remove(int toRemove) {
            //判断空
            if (isEmpty()) {
                System.out.println("顺序表为空");
                return;
            }
            //找下标
            int key = this.search(toRemove);
            if (key == -1) {
                System.out.println("没找到关键字key");
                return;
            }
            //删除
            for (int i = key; i < this.usedSize-1; i++) {
                this.elem[i] = this.elem[i+1];
            }
            //记录元素变量减一
            this.usedSize--;
        }

        // 清空顺序表
        public void clear() {
            for (int i = 0; i < this.usedSize; i++){
                this.elem[i] = 0;
            }
            this.usedSize = 0;
        }
}
